<?php
/**
 * 角色管理模块.
 * User: 1874
 * Date: 2019/5/8
 * Time: 15:05
 */

namespace app\adminplatform\controller;

use app\adminplatform\model\AuthGroup;
use app\adminplatform\model\AuthRule;
use app\adminplatform\model\Admin AS AdminModel;
use app\adminplatform\model\Log;
use think\facade\Request;
use think\facade\Session;
use think\facade\View;

class Role extends Initial {
    /*
     * 角色列表
     */
    public function roleList(){
        //管理员信息
        $userData = Session::get('userData');
        //当前管理员信息
        $adminInfo = AdminModel::getAdminInfo(["ad_id"=>$userData['ad_id']]);
        //查询我下级的角色组递归排列
        $info = findChildLevel(AuthGroup::getAuthGroupList()->toArray(), "ag_pid", "ag_id", $adminInfo['ad_role']);
        //管理员权限
        $rules = [
            'Role/roleAdd', 'Role/roleEdit', 'Role/roleCompetence', 'Role/roleDel', 'Role/roleDelAll'
        ];
        $check = AuthGroup::checkMethodArray($userData, $rules);

        View::assign('info', $info);
        View::assign('check', $check);
        return View::fetch('roleList');
    }
    /*
     * 角色新增
     */
    public function roleAdd(){
        //判断请求类型
        if(Request::isPost()){
            $request = input();
            //是否接收pid
            if(!empty($request['pid'])) {
                $map['ag_pid'] = $request['pid'];
            }
            $map['ag_name']  = $request['name'];
            $map['ag_status']  = $request['status'];
            //检查字段是否为空
            checkField($map);
            //新增信息
            $info = AuthGroup::create($map);
            if($info){
                //写入日志
                Log::logAdd(Session::get('userData.ad_id'),'新增角色【'.$map['ag_name'].'】');

                $data = ['info'=>'新增成功','status'=>1];
            }else{
                $data = ['info'=>'不好意思，信息没有改变','status'=>0];
            }
            return json($data);
        }
        //是否接收到pid
        if(input('pid')) {
            $map[] = ['ag_id','=',input('pid')];
        }else{
            $adminInfo = AdminModel::getAdminInfo(["ad_id"=>Session::get('userData.ad_id')]);
            $map[] = ['ag_id','=',$adminInfo->ad_role];
        }
        //没pid只能新增自己所属角色下角色
        $role = AuthGroup::getAuthGroupInfo($map);

        View::assign('role', $role);
        return View::fetch('roleAdd');
    }
    /*
     * 角色权限
     */
    public function roleCompetence(){
        $agId = input('id');
        //角色信息
        $info = AuthGroup::getAuthGroupInfo(["ag_id"=>$agId]);

        View::assign('info',$info);
        return View::fetch('roleCompetence');
    }
    /*
     * 获取角色权限api
     */
    public function getRuleList(){
		$userData = Session::get("userData");
		//如果是超级管理员
		if($userData["ad_role"] <= 0){
			//查询拥有的权限数组
			$role = AuthRule::where("ar_status",1)->field('ar_id,ar_pid,ar_name')->select();
		}else{
			//管理员所管理的权限id
			$ids = AuthGroup::where("ag_id", $userData["ad_role"])->value("ag_rules");
			//查询拥有的权限数组
			$role = AuthRule::where("ar_status",1)->whereIn("ar_id", $ids)->field('ar_id,ar_pid,ar_name')->select();
		}
        //遍历权限重新组装
        $roleList = AuthRule::findChildAuthRule($role->toArray());

        return json($roleList);
    }
    /*
     * 角色权限提交方法
     */
    public function roleCompetenceFunc(){
        $request = input();

        $map['ag_id'] = $request['id'];
        if(!empty($request['ids'])){
            $map['ag_rules'] = implode(',',$request['ids']);
        }else{
            $map['ag_rules'] = "";
        }
        //检查字段是否为空
        checkField($map);
        //权限更新
        $info = AuthGroup::update($map, ["ag_id"=>$map["ag_id"]]);
        if($info){
            //查询角色组名
            $name = AuthGroup::getAuthGroupInfo(["ag_id"=>$map["ag_id"]])->ag_name;
            //写入日志
            Log::logAdd(Session::get('userData.ad_id'),'编辑角色权限【'.$name.'】');

            $data = ['info'=>'权限编辑成功','status'=>1];
        }else{
            $data = ['info'=>'不好意思，信息没有改变','status'=>0];
        }

        return json($data);
    }
    /*
     * 角色编辑
     */
    public function roleEdit(){
        $id = input('id');
        //判断请求类型
        if(Request::isPost()){
            $request = input();
            $map['ag_id']  = $request['id'];
            $map['ag_name']  = $request['name'];
            $map['ag_status']  = $request['status'];
            //如果接收pid
            if($request['pid'] != '') {
                $map['ag_pid'] = $request['pid'];
                //如果pid = 自身id时
                if($map['ag_pid'] == $map['ag_id']) return json(["info"=>"不能移动到本身角色下","status"=>0]);
            }
            //检查字段是否为空
            checkField($map);
            //修改信息
            $info = AuthGroup::update($map, ["ag_id"=>$map["ag_id"]]);
            if($info){
                //写入日志
                Log::logAdd(Session::get('userData.ad_id'),'编辑角色【'.$map['ag_name'].'】');

                $data = ['info'=>'编辑成功','status'=>1];
            }else{
                $data = ['info'=>'不好意思，信息没有改变','status'=>0];
            }
            return json($data);
        }
        //当前管理员信息
        $adminInfo = Session::get('userData');
        //角色组信息
        $info = AuthGroup::getAuthGroupInfo(["ag_id"=>$id]);
        //查询我管理的角色
        $role = findChildLevel(AuthGroup::getAuthGroupList()->toArray(), "ag_pid", "ag_id", $adminInfo['ad_role']);
        //如果编辑角色不在我管理角色下则报错
        if(!AuthGroup::isMyAuthGroup($role, $id)) alertDemo("此角色不在您管理范围");
        //所属上级
        $onRole = AuthGroup::getAuthGroupInfo(["ag_id"=>$info["ag_pid"]]);
        if(!$onRole) $onRole['ag_name'] = "顶级";

        //View::assign('role', $role);
        View::assign('info', $info);
        View::assign('onRole',$onRole);
        View::assign('adminInfo',$adminInfo);
        return View::fetch('roleEdit');
    }
    /*
     * 获取当前管理员所管的下级角色组，并去除我点击的角色组
     */
    public function getChildAuthGroup(){
        $userData = Session::get('userData');
        //获取id
        $id = input("id");
        //获取所有的角色组,去除id = 编辑id的角色组
        $roleArray = AuthGroup::getAuthGroupList()->toArray();
        foreach ($roleArray as $key => $value){
            if($value["ag_id"] == $id){
                unset($roleArray[$key]);
            }
        }
        //当前管理员只能创建下级部门的管理员
        $role = AuthGroup::getChildAuthGroup($roleArray, $userData["ad_role"]);
        //新增顶级选项
        $key = count($role) + 1;
        $data = [
            $key =>["id"=>0, "label"=>"顶级", "children"=>[]]
        ];
        $role = array_merge($role, $data);

        return json($role);
    }
    /*
     * 角色删除
     */
    public function roleDel(){
        //判断请求类型
        if(!Request::isPost()){
            $data = ['info'=>'请求类型不是这个哦，亲','status'=>0];
        }else{
            $agId = input('id');
            //角色下方是否还有所属角色
            $roleCount = AuthGroup::getAuthGroupInfo(["ag_pid"=>$agId], 1);
            if($roleCount > 0){
                $data = ['info'=>'角色所属下还有下级角色，无法删除','status'=>0];
                return json($data);
            }
            //查询角色下是否有管理员
            $count = AdminModel::getAdminInfo(["ad_role"=>$agId], 1);
            if($count > 0){
                $data = ['info'=>'角色所属下还有人员信息，无法删除','status'=>0];
            }else{
                $authGroup = AuthGroup::getAuthGroupInfo(["ag_id"=>$agId]);
                //删除信息
                $info = $authGroup->delete();
                if($info){
                    //写入日志
                    Log::logAdd(Session::get('userData.ad_id'),'删除角色【'.$authGroup->ag_name.'】');

                    $data = ['info'=>'删除成功','status'=>1];
                }else{
                    $data = ['info'=>'不好意思，删除失败了','status'=>0];
                }
            }
        }

        return json($data);
    }
    /*
     * 角色批量删除
     */
    public function roleDelAll(){
        //判断请求类型
        if(!Request::isPost()){
            $data = ['info'=>'请求类型不是这个哦，亲','status'=>0];
        }else{
            //删除的角色id数组
            $ids = input('ids');
            //角色下方是否还有所属角色
            foreach ($ids as $value){
                //是否有下级角色
                $underIds = AuthGroup::where("ag_pid", $value)->column("ag_id");
                if ($underIds) {
                    //下级id没有包含在删除id中则提示
                    $diffId = array_diff($underIds, $ids);
                    if($diffId){
                        $name = AuthGroup::getAuthGroupInfo(["ag_pid"=>$value])->ag_name;
                        $data = ['info' => '【' . $name . '】还有下级角色，无法删除', 'status' => 0];
                        return json($data);
                    }
                }
            }
            //角色下是否有管理员
            $roleIds = AdminModel::column('ad_role');
            //角色下是否有管理员信息
            foreach ($roleIds as $value){
                if(in_array($value, $ids)){
                    $name = AuthGroup::getAuthGroupInfo(["ag_id"=>$value])->ag_name;
                    $data = ['info'=>'【'.$name.'】还有管理员信息，无法删除','status'=>0];
                    return json($data);
                }
            }
            //删除信息
            $info = AuthGroup::where("ag_id", "in", $ids)->delete();
            if($info){
                //写入日志
                Log::logAdd(Session::get('userData.ad_id'),'删除角色'.$info.'条');

                $data = ['info'=>'删除成功','status'=>1];
            }else{
                $data = ['info'=>'不好意思，删除失败了','status'=>0];
            }
        }
        return json($data);
    }
}